package com.bipbip.repositorio;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.bipbip.modelo.Producto;
import com.bipbip.modelo.Usuario;

@Repository(value = "usuarioDao")
@Transactional(readOnly = true)
public class JPAUsuarioDAO implements UsuarioDAO {

	private static final Logger log = Logger.getLogger(JPAUsuarioDAO.class);

	private EntityManager em = null;

	/*
	 * Sets the entity manager.
	 */
	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.em = em;
	}

	@Transactional(readOnly = true)
	public Usuario getUsuarioBy(String attr, String value) {
		return (Usuario) em.createQuery(
				"select u from Usuario u where " + attr + "='" + value + "'")
				.getSingleResult();
	}

	@Transactional(readOnly = true)
	public Usuario getUsuarioBy(String attr, Long value) {
		return (Usuario) em.createQuery(
				"select u from Usuario u where " + attr + "=" + value + "")
				.getSingleResult();
	}

	@Transactional(readOnly = true)
	public Usuario getUsuarioBy(String attr, Integer value) {
		return (Usuario) em.createQuery(
				"select u from Usuario u where " + attr + "=" + value + "")
				.getSingleResult();
	}

	@Transactional(readOnly = true)
	public Usuario getUsuarioByEmailAndPassword(String email, String password) {
		try {
			return (Usuario) em.createQuery(
					"select u from Usuario u where email='" + email
							+ "' and password='" + password + "'")
					.getSingleResult();
		} catch (NoResultException e) {
			log.info("No se encontro usuario");
			return null;
		}
	}

	@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
	public Usuario insert(Usuario u) {
		em.persist(u);
		return u;
	}

	@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
	public Usuario update(Usuario u) {
		return em.merge(u);
	}

	@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
	public void delete(Usuario u) {
		em.remove(em.merge(u));
	}

	public Usuario select(int id) {
		return em.find(Usuario.class, id);
	}

	public List<Usuario> selectAll() {
		return em.createQuery("select u from Usuario u").getResultList();
	}

	public List<Usuario> getUsuariosBy(String attr, Integer value) {
		return em.createQuery(
				"select u from Usuario u where " + attr + "=" + value)
				.getResultList();
	}

	public Usuario getUsuarioAdmin(int empresa) {
		return (Usuario) em.createQuery(
				"select u from Usuario u where idProducto="
						+ Producto.enterprise + " and idEmpresa=" + empresa)
				.getSingleResult();
	}

}
